package org.springblade.tms.module.tank.base;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.common.constant.TenantConstant;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.tms.global.enums.UserTypeEnum;
import org.springblade.tms.global.exception.CommonException;
import org.springblade.tms.module.carriertankrelation.entity.TMCarrierTankRelation;
import org.springblade.tms.module.carriertankrelation.service.ICarrierTankRelationService;
import org.springblade.tms.module.tank.entity.TMTankTank;
import org.springblade.tms.module.tank.service.ITankTankService;
import org.springblade.tms.module.tank.vo.TMTankTankVO;
import org.springblade.tms.module.tank.vo.TankVo;
import org.springblade.tms.module.tank.wrapper.TankTankWrapper;
import org.springblade.tms.module.userinfo.entity.TMUserInfo;
import org.springblade.tms.module.userinfo.service.IUserInfoService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @projectName: BladeX
 * @package: org.springblade.tms.module.tank.base
 * @className: TankService
 * @author: yr
 * @description: 坦克罐服务类
 * @date: 2022/5/31 16:42
 */
@Service
public class TankService {
	@Resource
	private ITankTankService tankTankService;
	@Resource
	private ICarrierTankRelationService carrierTankRelationService;
	@Resource
	private IUserInfoService userInfoService;

	/**
	 * @param tankVo:
	 * @param query:
	 * @return void
	 * @author yr
	 * @description 坦克罐列表查询
	 * @date 2022/5/31 16:46
	 */
	public R<IPage<TMTankTankVO>> list(TankVo tankVo, Query query) {
		LambdaQueryWrapper<TMTankTank> wrapper = Condition.getQueryWrapper(new TMTankTank()).lambda()
			.like(tankVo.getTankNumber() != null, TMTankTank::getTankNumber, tankVo.getTankNumber())
			.like(tankVo.getProduct() != null, TMTankTank::getProduct, tankVo.getProduct());
		Long userId = AuthUtil.getUser().getUserId();
		TMUserInfo tmUserInfo = userInfoService.lambdaQuery().eq(TMUserInfo::getParentId, userId).one();
		if (tmUserInfo != null && tmUserInfo.getUserType().equals(UserTypeEnum.CARRIER.getValue())) {
			List<Long> tankIds = carrierTankRelationService.lambdaQuery()
				.eq(TMCarrierTankRelation::getRelationCarrierNo, tmUserInfo.getId())
				.list().stream().map(TMCarrierTankRelation::getRelationTankNo).collect(Collectors.toList());
			wrapper.in(!tankIds.isEmpty(), TMTankTank::getId, tankIds)
				.apply(tankIds.isEmpty(), "1=2");
		}
		IPage<TMTankTank> tmTankTankIPage = tankTankService.page(Condition.getPage(query), wrapper);
		IPage<TMTankTankVO> tankVOIPage = TankTankWrapper.build().pageVO(tmTankTankIPage);
		return R.data(tankVOIPage);
	}

	/**
	 * @param tankVo:
	 * @param tmUserInfo:
	 * @return R
	 * @author yr
	 * @description 新增或修改坦克罐
	 * @date 2022/5/31 17:48
	 */
	public R saveOrUpdate(TankVo tankVo, TMUserInfo tmUserInfo) {
		TMTankTank tmTankTank = BeanUtil.copy(tankVo, TMTankTank.class);
		TMTankTank one = tankTankService.lambdaQuery()
			.eq(TMTankTank::getTankNumber, tmTankTank.getTankNumber())
			.ne(tankVo.getId() != null, TMTankTank::getId, tankVo.getId())
			.one();
		//通过id判断是新增还是修改
		if (tmTankTank.getId() != null) {
			if (one != null) {
				CommonException.throwCommonException("罐号已存在");
			}
			return R.status(tankTankService.updateById(tmTankTank));
		} else {
			if (tmUserInfo != null && tmUserInfo.getUserType().equals(UserTypeEnum.CARRIER.getValue())) {
				if (one != null) {
					TMCarrierTankRelation tmCarrierTankRelation = carrierTankRelationService.lambdaQuery()
						.eq(TMCarrierTankRelation::getRelationTankNo, one.getId())
						.eq(TMCarrierTankRelation::getRelationCarrierNo, tmUserInfo.getId())
						.one();
					if (tmCarrierTankRelation != null) {
						CommonException.throwCommonException("坦克罐已存在");
					}
					R<Object> r = new R<>();
					r.setCode(206);
					r.setSuccess(true);
					r.setMsg("系统中已存在该坦克罐，是否进行绑定？");
					return r;
				} else {
					tankTankService.save(tmTankTank);
					TMCarrierTankRelation carrierTankRelation = new TMCarrierTankRelation();
					carrierTankRelation.setRelationCarrierNo(tmUserInfo.getId());
					carrierTankRelation.setRelationTankNo(tmTankTank.getId());
					carrierTankRelationService.save(carrierTankRelation);
					return R.status(true);
				}
			} else {
				if (one != null) {
					CommonException.throwCommonException("罐号已存在");
				}
				return R.status(tankTankService.save(tmTankTank));
			}
		}
	}
	/**
	 * @param tmTankTank:
	 * @param tmUserInfo:
	 * @return R
	 * @author yr
	 * @description 新增或修改坦克罐
	 * @date 2022/5/31 17:48
	 */
	public R excelSaveOrUpdate(TMTankTank tmTankTank, TMUserInfo tmUserInfo) {
		TMTankTank one = tankTankService.lambdaQuery()
			.eq(TMTankTank::getTankNumber, tmTankTank.getTankNumber())
			.ne(tmTankTank.getId() != null, TMTankTank::getId, tmTankTank.getId())
			.one();
		//通过id判断是新增还是修改
		if (tmTankTank.getId() != null) {
			if (one != null) {
				CommonException.throwCommonException("罐号已存在");
			}
			return R.status(tankTankService.updateById(tmTankTank));
		} else {
			if (tmUserInfo != null && tmUserInfo.getUserType().equals(UserTypeEnum.CARRIER.getValue())) {
				if (one != null) {
					return R.status(false);
				} else {
					tankTankService.save(tmTankTank);
					TMCarrierTankRelation carrierTankRelation = new TMCarrierTankRelation();
					carrierTankRelation.setRelationCarrierNo(tmUserInfo.getId());
					carrierTankRelation.setRelationTankNo(tmTankTank.getId());
					carrierTankRelation.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
					carrierTankRelationService.save(carrierTankRelation);
					return R.status(true);
				}
			} else {
				if (one != null) {
					CommonException.throwCommonException("罐号已存在");
				}
				return R.status(tankTankService.save(tmTankTank));
			}
		}
	}

	/**
	 * @param ids:
	 * @return R<Boolean>
	 * @author yr
	 * @description 删除坦克罐
	 * @date 2022/6/2 9:46
	 */
	public R<Boolean> delete(List<Long> ids, TMUserInfo userInfo) {
		if (userInfo != null && userInfo.getUserType().equals(UserTypeEnum.CARRIER.getValue())) {
			carrierTankRelationService.remove(Condition.getQueryWrapper(new TMCarrierTankRelation())
				.lambda().eq(TMCarrierTankRelation::getRelationCarrierNo, userInfo.getId())
				.in(TMCarrierTankRelation::getRelationTankNo, ids));
			List<TMCarrierTankRelation> list = carrierTankRelationService.lambdaQuery()
				.in(TMCarrierTankRelation::getRelationTankNo, ids)
				.select(TMCarrierTankRelation::getRelationTankNo).list();
			List<Long> driverIds = list.stream().map(TMCarrierTankRelation::getRelationTankNo).collect(Collectors.toList());
			ids.removeAll(driverIds);
			if (!ids.isEmpty()) {
				tankTankService.deleteLogic(ids);
			}
			return R.status(true);
		} else {
			tankTankService.deleteLogic(ids);
			return R.status(true);
		}
	}
}
